//给你两个单词 word1 和 word2，请你计算出将 word1 转换成 word2 所使用的最少操作数 。 
//
// 你可以对一个单词进行如下三种操作： 
//
// 
// 插入一个字符 
// 删除一个字符 
// 替换一个字符 
// 
//
// 
//
// 示例 1： 
//
// 输入：word1 = "horse", word2 = "ros"
//输出：3
//解释：
//horse -> rorse (将 'h' 替换为 'r')
//rorse -> rose (删除 'r')
//rose -> ros (删除 'e')
// 
//
// 示例 2： 
//
// 输入：word1 = "intention", word2 = "execution"
//输出：5
//解释：
//intention -> inention (删除 't')
//inention -> enention (将 'i' 替换为 'e')
//enention -> exention (将 'n' 替换为 'x')
//exention -> exection (将 'n' 替换为 'c')
//exection -> execution (插入 'u')
// 
// Related Topics 字符串 动态规划 
// 👍 1105 👎 0

package leetcode.editor.cn;

//Java：编辑距离
public class P72EditDistance {

    /**
     *
     * 思路： 网上的思路， 动态规划  dp[i][j] 等于 增删改最小的，再加上1
     *
     * 执行用时： 7 ms , 在所有 Java 提交中击败了 46.29% 的用户 内存消耗： 39.9 MB , 在所有 Java 提交中击败了 44.29% 的用户
     *
     */
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int minDistance(String word1, String word2) {
            // dp[i][j] 表示 word1的前i个 转成 word2的前j个 的操作数
            int[][] dp = new int[word1.length() + 1][word2.length() + 1];
            dp[0][0] = 0;
            for (int i = 1; i <= word1.length(); i++) {
                dp[i][0] = i;
            }
            for (int j = 1; j <= word2.length(); j++) {
                dp[0][j] = j;
            }

            for (int i = 1; i <= word1.length(); i++) {
                for (int j = 1; j <= word2.length(); j++) {
                    // 字母相同，等于前一个
                    if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                        dp[i][j] = dp[i - 1][j - 1];
                    } else {
                        // i 3    abcdefg
                        // j 5    abcaaaa

                        // 增
                        int a = dp[i][j - 1] + 1;
                        // 删
                        int d = dp[i - 1][j] + 1;
                        // 改
                        int u = dp[i - 1][j - 1] + 1;
                        int min = a;
                        if (d < min) {
                            min = d;
                        }
                        if (u < min) {
                            min = u;
                        }
                        dp[i][j] = min;
                    }
                }
            }

            return dp[word1.length()][word2.length()];
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

    public static void main(String[] args) {
        String word1 = "i";
        String word2 = "";
        Solution solution = new P72EditDistance().new Solution();
        System.out.println(solution.minDistance(word1,word2));
        // TO TEST
    }

}